#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/types.h>
#include<sys/wait.h>


void handle_tasks()
{
}

int main()
{
    pid_t id=fork();
    if(id==0)
    {
        printf("我是子进程，ppid:%d,pid:%d\n",getppid(),getpid());
        int a=0;
        int b=0;
        int *c=NULL;
        *c=1;
       // int c=a/b;
        sleep(5);
    }
    else 
    {
        printf("我是父进程，ppid:%d,pid:%d\n",getppid(),getpid());
        while(1)
        {
            int status=0;
            pid_t ret=waitpid(id,&status,WNOHANG);
            if(ret==-1)
            {
                printf("等待%d子进程失败!\n",id);
                perror("waitpid");
                break;
            }
            else if(ret==0)
            {
                handle_tasks();//子进程还没有退出,父进程可以做其他事情
                sleep(1);//避免过度占用CPU
            }
            else if(ret==id )
            {
                printf("等待%d子进程成功！\n",id);
                //int sign=status & 0x7F;//提取低7位（信号编号）
                //int coredump=(status>>7) & 1;//提取第7位（core dump标志)
                //int exitsc=(status>>8) & 0xFF;//提取高8位（退出码)
                if (WIFEXITED(status)) 
                {
                    // 正常退出情况
                     printf("子进程正常退出，退出码：%d\n", WEXITSTATUS(status));
                 } 
                else if (WIFSIGNALED(status)) 
                {
                // 信号终止情况
                printf("子进程被信号终止，信号：%d", WTERMSIG(status));
                     if (WCOREDUMP(status))
                     {
                         printf("，并生成了core dump文件");
                     }
                printf("\n");
                }
                break;
            }
        }
    }
    return 0;
}

//void handle_tasks()
//{
//}
//
//int main()
//{
//    pid_t id=fork();
//    if(id==0)
//    {
//        printf("我是子进程，ppid:%d,pid:%d\n",getppid(),getpid());
//        int a=0;
//        int b=0;
//        int *c=NULL;
//        //*c=1;
//       // int c=a/b;
//        sleep(5);
//    }
//    else 
//    {
//        printf("我是父进程，ppid:%d,pid:%d\n",getppid(),getpid());
//        while(1)
//        {
//            int status=0;
//            pid_t ret=waitpid(id,&status,WNOHANG);
//            if(ret==-1)
//            {
//                printf("等待%d子进程失败!\n",id);
//                perror("waitpid");
//                break;
//            }
//            else if(ret==0)
//            {
//                handle_tasks();//子进程还没有退出,父进程可以做其他事情
//                sleep(1);//避免过度占用CPU
//            }
//            else if(ret==id )
//            {
//                printf("等待%d子进程成功！\n",id);
//                int sign=status & 0x7F;//提取低7位（信号编号）
//                int coredump=(status>>7) & 1;//提取第7位（core dump标志)
//                int exitsc=(status>>8) & 0xFF;//提取高8位（退出码)
//                if(sign==0)
//                {
//                    printf("程序正常退出，退出码为：%d\n",exitsc);
//                }
//                else 
//                {
//                    //异常退出
//                    printf("信号终止进程，信号：%d \n",sign);
//                    if(coredump)
//                    {
//                        printf("生成了core文件\n");
//                    }
//                }
//                break;
//            }
//        }
//    }
//    return 0;
//}
//
////void handle_tasks()
//{
//  // printf("Hello,Tasks!\n");
//}
//
//int main()
//{
//    pid_t id=fork();
//    if(id==0)
//    {
//        printf("我是子进程，ppid:%d,pid:%d\n",getppid(),getpid());
//        sleep(5);
//    }
//    else 
//    {
//        printf("我是父进程，ppid:%d,pid:%d\n",getppid(),getpid());
//        while(1)
//        {
//            pid_t ret=waitpid(id,NULL,WNOHANG);
//            if(ret==-1)
//            {
//                printf("等待%d子进程失败!\n",id);
//                perror("waitpid");
//                break;
//            }
//            else if(ret==0)
//            {
//                handle_tasks();//子进程还没有退出,父进程可以做其他事情
//                sleep(1);//避免过度占用CPU
//            }
//            else if(ret==id )
//            {
//                printf("等待%d子进程成功！\n",id);
//
//                break;
//            }
//        }
//    }
//    return 0;
//}
//


////int N = 5;
////int main()
//{
//    printf("进程开始了！\n");
//    int i=0;
//    for(i=0;i<N;i++)
//    {
//        pid_t id=fork();
//        if(id==0)
//        {
//            //子进程
//            printf("我是pid为%d的子进程,ppid:%d\n",getpid(),getppid());
//            sleep(1);
//            exit(0);//子进程退出，不再进行循环
//        }
//        else 
//        {
//            printf("子进程%d被创建\n",id);
//            //int ret = waitpid(-1,NULL,0);
//            int ret = waitpid(id,NULL,0);
//            if(ret)
//            {
//                printf("等待pid为%d子进程成功\n",ret);
//            }
//        }
//    }
//    //for(i=0;i<N;i++)
//    //{
//    //     int ret=wait(NULL);
//    //     if(ret==-1)
//    //     {
//    //         printf("等待进程失败\n");
//    //     }
//    //     else 
//    //     {
//    //         printf("等待pid为%d的进程成功\n",ret);
//    //     }
//    //}
//    return 0;
//}
//
//
////int main()
//{
//    printf("进程开始了！\n");
//    pid_t id=fork();
//    if(id==0)
//    {
//        int cnt=5;
//        while(cnt--)
//        {
//            printf("%d:我是子进程,ppid:%d,pid:%d\n",cnt,getppid(),getpid());
//            sleep(1);
//        }
//    }
//    else 
//    {
//        int ret=wait(NULL);
//        if(ret==-1)
//        {
//            printf("等待进程失败\n");
//        }
//        else 
//        {
//            printf("等待pid为%d的进程成功\n",ret);
//        }
//    }
//    return 0;
//}



//int main()
//{
//    printf("进程开始了！\n");
//    pid_t id=fork();
//    if(id==0)
//    {
//        int cnt=10;
//        while(cnt--)
//        {
//            printf("%d:我是子进程，ppid:%d,pid:%d\n",cnt,getppid(),getpid());
//            sleep(1);
//        }
//    }
//    else 
//    {
//        printf("我是父进程，ppid:%d,pid:%d\n",getppid(),getpid());
//        sleep(15);
//        exit(1);
//    }
//}
//
//
//
//
//
//











//int main()
//{
//    printf("Hello,Xiaodu!");
//    int flag=1;
//    if(flag)
//        _exit(1);
//    _exit(0);
//}

//int main()
//{
//    printf("Hello,Xiaodu!\n");
//    int flag=1;
//    if(flag)
//        exit(1);
//    exit(0);
//}
////int print()
//{
//    printf("print函数调用开始了!\n");
//    int flag=1;
//    if(flag)
//        return 1;
//    printf("print函数调用结束了！\n");
//    return 0;
//}
//
//int main()
//{
//    printf("程序开始了！\n");
//    int ret = print();
//    printf("程序结束了！\n");
//    return 0;
//}



//int main()
//{
//    printf("Hello xiaodu!\n");
//    return 0;
//}
